package mac5789.projeto4.algorithm;

import mac5789.projeto4.model.Policy;
import mac5789.projeto4.model.WorldModel;

/**
 * Algoritmo que gera uma política ótima através de iteração de valores. <br/>
 * <br/>
 * Esta implementação não leva em conta estados meta e origem, portanto calcula
 * a política ótima para TODOS os estados.
 * 
 * @author lundberg
 * 
 */
public class ValueIterationMDP implements MarkovDecisionProcess {

	private final double acceptableError;

	private int iteractions = 0;

	/**
	 * Construtor
	 * 
	 * @param acceptableError acceptableError
	 */
	public ValueIterationMDP(double acceptableError) {
		this.acceptableError = acceptableError;
	}

	/**
	 * Constrói uma política ótima para o mundo.
	 * 
	 * @param world world
	 * @return política
	 */
	@Override
	public Policy createPolicy(WorldModel world) {
		BellmanBackup backup = BellmanBackup.allZeroes(world, world.states());
		while (iteractions < world.getMaxIteractions() && backup.getBellmanError() > acceptableError) {
			iteractions++;
			backup = backup.improve();
		}
		return backup.createPolicy();
	}

	public int getIteractions() {
		return iteractions;
	}
}
